﻿using System;
using System.Collections.Generic;
using Csla;
using Ent.AccesoDatos;

namespace Ent.Inscripcion.Core.Core
{
    [Serializable]
    public class EstudianteTutoriaLista :
      ReadOnlyListBase<EstudianteTutoriaLista, EstudianteTutoriaInfo>
    {

        #region Factory Methods

        public static EstudianteTutoriaLista GetEstudianteTutoriaLista(EstudianteTutoriaCriterio criteria)
        {
            return DataPortal.FetchChild<EstudianteTutoriaLista>(criteria);
        }

        private EstudianteTutoriaLista()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void Child_Fetch(EstudianteTutoriaCriterio criteria)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;
            // TODO: load values
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro>
                                 {
                                     new Parametro("Oferta", criteria.OfertaId),
                                     new Parametro("Nivel", criteria.NivelId),
                                     new Parametro("Dia", criteria.DiaId),
                                     new Parametro("Paralelo", criteria.ParaleloId),
                                     new Parametro("Docente", criteria.DocenteId),
                                     new Parametro("Cedula",criteria.Cedula)
                                 };
            var datos = accesoDatos.EjecutarReader("ObtenerEstudianteTutorias", parametros);
            while (datos.Datos.Read())
            {
                Add(EstudianteTutoriaInfo.GetEstudianteTutoriaInfo(datos));
            }
            if (!datos.Datos.IsClosed) datos.Datos.Close();
            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }

        #endregion
    }


    [Serializable]
    public class EstudianteTutoriaInfo : ReadOnlyBase<EstudianteTutoriaInfo>
    {
        #region Business Methods

        private static PropertyInfo<Guid> IdSolicitudTutoriaProperty = RegisterProperty<Guid>(o => o.IdSolicitudTutoria, "Name");
        public Guid IdSolicitudTutoria
        {
            get { return GetProperty(IdSolicitudTutoriaProperty); }
        }

        public static readonly PropertyInfo<string> NombreProperty = RegisterProperty<string>(c => c.Nombre);
        /// <Summary>
        /// Gets or sets the Nombre value.
        /// </Summary>
        public string Nombre
        {
            get { return GetProperty(NombreProperty); }
        }

        public static readonly PropertyInfo<string> ApellidosProperty = RegisterProperty<string>(c => c.Apellidos);
        /// <Summary>
        /// Obtiene o setea el valor del apellido
        /// </Summary>
        public string Apellidos
        {
            get { return GetProperty(ApellidosProperty); }
        }

        public static readonly PropertyInfo<string> IdentificacionProperty = RegisterProperty<string>(c => c.Identificacion);
        /// <Summary>
        /// Gets or sets the Identificacion value.
        /// </Summary>
        public string Identificacion
        {
            get { return GetProperty(IdentificacionProperty); }
        }

        private static PropertyInfo<string> CarreraProperty = RegisterProperty<string>(o => o.Carrera, "Name");
        public string Carrera
        {
            get { return GetProperty(CarreraProperty); }
         
        }

        public static readonly PropertyInfo<string> EmailProperty = RegisterProperty<string>(c => c.Email);
        /// <Summary>
        /// Gets or sets the Email value.
        /// </Summary>
        public string Email
        {
            get { return GetProperty(EmailProperty); }
        }

        public static readonly PropertyInfo<string> DireccionProperty = RegisterProperty<string>(c => c.Direccion);
        /// <Summary>
        /// Gets or sets the Direccion value.
        /// </Summary>
        public string Direccion
        {
            get { return GetProperty(DireccionProperty); }
        }

        public static readonly PropertyInfo<string> CelularProperty = RegisterProperty<string>(c => c.Celular);
        /// <Summary>
        /// Obitiene o setea el valor del campo celular
        /// </Summary>
        public string Celular
        {
            get { return GetProperty(CelularProperty); }
        }

        private static PropertyInfo<string> TelefonoProperty = RegisterProperty<string>(o => o.Telefono, "Name");
        public string Telefono
        {
            get { return GetProperty(TelefonoProperty); }
        }

        private static PropertyInfo<string> EstadoProperty = RegisterProperty<string>(o => o.Estado, "Name");
        public string Estado
        {
            get { return GetProperty(EstadoProperty); }
        }

        private static PropertyInfo<string> ImagenProperty = RegisterProperty<string>(o => o.Imagen, "Name");
        public string Imagen
        {
            get { return GetProperty(ImagenProperty); }
        }

        private static PropertyInfo<string> NombrePeriodoProperty = RegisterProperty<string>(o => o.NombrePeriodo, "NombrePeriodo");
        public string NombrePeriodo
        {
            get { return GetProperty(NombrePeriodoProperty); }
        }

        private static PropertyInfo<string> DiaProperty = RegisterProperty<string>(o => o.Dia, "Name");
        public string Dia
        {
            get { return GetProperty(DiaProperty); }
        }

        private static PropertyInfo<string> NivelProperty = RegisterProperty<string>(o => o.Nivel, "Name");
        public string Nivel
        {
            get { return GetProperty(NivelProperty); }
        }

        private static PropertyInfo<string> AulaProperty = RegisterProperty<string>(o => o.Aula, "Name");
        public string Aula
        {
            get { return GetProperty(AulaProperty); }
        }

        private static PropertyInfo<string> ParaleloProperty = RegisterProperty<string>(o => o.Paralelo, "Name");
        public string Paralelo
        {
            get { return GetProperty(ParaleloProperty); }
        }

        private static PropertyInfo<string> NombreDocenteProperty = RegisterProperty<string>(o => o.NombreDocente, "Name");
        public string NombreDocente
        {
            get { return GetProperty(NombreDocenteProperty); }
        }

        private static PropertyInfo<string> CelularDocenteProperty = RegisterProperty<string>(o => o.CelularDocente, "Name");
        public string CelularDocente
        {
            get { return GetProperty(CelularDocenteProperty); }
        }

        private static PropertyInfo<string> MailDocenteProperty = RegisterProperty<string>(o => o.MailDocente, "Name");
        public string MailDocente
        {
            get { return GetProperty(MailDocenteProperty); }
        }

        #endregion

        #region Factory Methods

        internal static EstudianteTutoriaInfo GetEstudianteTutoriaInfo(object childData)
        {
            return DataPortal.FetchChild<EstudianteTutoriaInfo>(childData);
        }

        private EstudianteTutoriaInfo()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void Child_Fetch(Reader datos)
        {
            LoadProperty(IdSolicitudTutoriaProperty, Guid.Parse(datos.Datos.GetString(10)));
            LoadProperty(IdentificacionProperty, datos.Datos.GetString(1));
            LoadProperty(NombreProperty, datos.Datos.GetString(2));
            LoadProperty(ApellidosProperty, datos.Datos.GetString(3));
            LoadProperty(CarreraProperty, datos.Datos.GetString(4));
            LoadProperty(EmailProperty, datos.Datos.GetString(5));
            LoadProperty(TelefonoProperty, datos.Datos.GetString(6));
            LoadProperty(CelularProperty, datos.Datos.GetString(7));
            LoadProperty(DireccionProperty, datos.Datos.GetString(8));
            LoadProperty(ImagenProperty, datos.Datos.GetString(9));
            LoadProperty(EstadoProperty, datos.Datos.GetString(11));
            LoadProperty(NombrePeriodoProperty, datos.Datos.GetString(12));
            LoadProperty(NivelProperty, datos.Datos.GetString(13));
            LoadProperty(DiaProperty, datos.Datos.GetString(14));
            LoadProperty(ParaleloProperty, datos.Datos.GetString(15));
            LoadProperty(AulaProperty, datos.Datos.GetString(16));
            LoadProperty(NombreDocenteProperty, string.Format("{0} {1}", datos.Datos.GetString(17), datos.Datos.GetString(18)));
            LoadProperty(CelularDocenteProperty, datos.Datos.GetString(19));
            LoadProperty(MailDocenteProperty, datos.Datos.GetString(20));
        }
        #endregion
    }
}
